package com.creative.user.controller;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.codec.Base64;
import cn.hutool.core.io.resource.ResourceUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.alibaba.excel.EasyExcel;
import com.creative.config.AppConfig;
import com.creative.constant.Constants;
import com.creative.core.controller.BaseController;
import com.creative.core.domain.AjaxResult;
import com.creative.core.page.TableDataInfo;
import com.creative.user.domain.UserInfo;
import com.creative.user.domain.vo.UserInfoVo;
import com.creative.user.service.UserInfoService;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;

/**
 * 用户信息控制类
 *
 * @author Ling
 * @description 用户信息表
 * @date 2024-11-12
 */
@RestController
@RequestMapping(value = "/userInfo")
public class UserInfoController extends BaseController {

    @Resource
    private UserInfoService userInfoService;

    @Resource
    private AppConfig appConfig;

    /**
     * 新增
     *
     * @author Ling
     * @date 2024/11/12
     **/
    @PostMapping
    public AjaxResult insert(UserInfo userInfo) {
//        如果UserInfo对象的参数不符合规则，则返回提示
        logger.info("新增用户信息，userInfo:{}", userInfo);
        return toAjax(userInfoService.insert(userInfo));
    }

    /**
     * 刪除
     *
     * @author Ling
     * @date 2024/11/12
     **/
    @DeleteMapping("/{userId}")
    public AjaxResult delete(@PathVariable("userId") String userId) {

        return toAjax(userInfoService.delete(userId.trim()));
    }

    /**
     * 批量刪除
     *
     * @author ling
     * @date 2025/02/27
     **/

    @DeleteMapping("/batch")
    public AjaxResult deleteBatch(@RequestBody String[] ids) {
        return toAjax(userInfoService.deleteBatch(ids));
    }

    /**
     * 更新
     *
     * @author Ling
     * @date 2024/11/12
     **/
    @PutMapping("/update")
    public AjaxResult update(@RequestBody UserInfo userInfo) {
        logger.info("更新用户信息，userInfo:{}", userInfo);
        return toAjax(userInfoService.update(userInfo));
    }


    /**
     * 查询 根据主键 id 查询
     *
     * @author Ling
     * @date 2024/11/12
     **/
    @GetMapping(value = "/{userId}")
    public AjaxResult selectById(@PathVariable("userId") String userId) {
        logger.info("查询用户信息，userId:{}", userId);
        if (userId == null) {
            return error("参数为空");
        }
        UserInfo userInfo = userInfoService.selectById(userId.trim());
        //        转换为vo
        UserInfoVo userInfoVo = BeanUtil.copyProperties(userInfo, UserInfoVo.class);
//        返回用户的信息
        return toAjax(userInfoVo);
    }


    /**
     * 查询 分页查询(带条件)
     *
     * @author Ling
     * @date 2024/11/12
     **/
    @GetMapping("/list")
    public TableDataInfo selectUserInfoList(UserInfo userInfo) {
        logger.info("分页查询用户信息-查询条件，userInfoDto:{}", userInfo);
        return userInfoService.selectUserInfoList(userInfo);
    }

    /**
     * 批量导出
     *
     * @author ling
     * @date 2025/02/27
     **/
    @PostMapping("/export")
    public void export(@RequestBody String[] ids, HttpServletResponse response) throws IOException {
        //        判断ids是否为空
        if (ids == null || ids.length == 0) {
            // ids 为空或未初始化时执行的代码
            throw new RuntimeException("ids为空");
        }
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
        String fileName = URLEncoder.encode("用户信息" + System.currentTimeMillis(), StandardCharsets.UTF_8);
        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
        EasyExcel.write(response.getOutputStream(), UserInfo.class)
                .sheet("用户信息")
                .doWrite(() -> {
                    // 查询数据
                    return userInfoService.exportBatch(ids);
                });
        logger.info("导出成功");
    }

    /**
     * 按名称和密码选择
     *
     * @param nickName 昵称
     * @param password 密码
     * @return {@link AjaxResult }
     * @author ling
     * @date 2024/12/01
     */
    @GetMapping("/np")
    public AjaxResult selectByNameAndPassword(String nickName, String password) {

        return toAjax(userInfoService.selectByNameAndPassword(nickName.trim(), password.trim()));
    }

    /**
     * 通过电子邮件选择
     *
     * @param email 电子邮件
     * @return {@link AjaxResult }
     * @author ling
     * @date 2024/12/01
     */
    @GetMapping("/eamil")
    public AjaxResult selectByEmail(@PathVariable("email") String email) {
        return toAjax(userInfoService.selectByEmail(email.trim()));
    }

    /**
     * 获取头像
     *
     * @param userId 用户id
     * @return {@link AjaxResult }
     * @author ling
     * @date 2024/12/01
     */
    @GetMapping("/getAvatar/{userId}")
    public AjaxResult getAvatar(@PathVariable("userId") String userId) {
//        logger.info("获取用户头像，userId:{}",userId);
//        获取文件的保存目录
        String fileSavePath = appConfig.getFileSavePath() + Constants.FILE_SAVE_PATH + Constants.FILE_FOLDER_AVATAR_NAME;
        File file = new File(fileSavePath);
        if (!file.exists()) {
            file.mkdirs();
        }
//        获取用户的头像保存地址
        UserInfo userInfo = userInfoService.selectById(userId.trim());
        String avatarPath = userInfo.getAvatar();
//        头像保存目录
//        String avatarPath = fileSavePath + userId + Constants.FILE_FOLDER_AVATAR_NAME_SUFFIX;
        logger.info("获取用户头像路径，avatarPath:{}", userInfo.getAvatar());

//        默认头像的路径
        String defaultAvatarPath = fileSavePath + Constants.AVATAR_DEFAULT + Constants.FILE_FOLDER_AVATAR_NAME_SUFFIX;

//        如果头像为空
        if (avatarPath == null) {
//            使用默认头像
            //        转换为64编码的图片输出前端 （先将文件读出，转为byte类型数据，再将byte数据转为base64编码的数据传到前端）
            String Base64Png = Base64.encode(ResourceUtil.readBytes(defaultAvatarPath));
            return toAjax(Base64Png);
        }
        File avatarFile = new File(avatarPath);

//        如果文件不存在
        if (!avatarFile.exists()) {

            logger.info("用户头像不存在，使用默认头像");
            avatarPath = defaultAvatarPath;
            //        转换为64编码的图片输出前端 （先将文件读出，转为byte类型数据，再将byte数据转为base64编码的数据传到前端）
            String Base64Png = Base64.encode(ResourceUtil.readBytes(avatarPath));
            return toAjax(Base64Png);
        }
//        文件存在
        //        转换为64编码的图片输出前端 （先将文件读出，转为byte类型数据，再将byte数据转为base64编码的数据传到前端）
        String Base64Png = Base64.encode(ResourceUtil.readBytes(avatarPath));
        return toAjax(Base64Png);
    }

    /**
     * 更新头像
     *
     * @param avatar 头像
     * @return {@link AjaxResult }
     * @author ling
     * @date 2024/12/05
     */
    @PostMapping("/updateAvatar")
    public AjaxResult updateAvatar(@RequestBody String avatar) {
//        logger.info("更新用户头像，avatar:{}", avatar);
        JSONObject jsonObject = JSONUtil.parseObj(avatar);
        String name = jsonObject.getStr("name");
        logger.info("更新用户头像，name:{}", name);
        String avatarBase64 = jsonObject.getStr("file");
//        logger.info("更新用户头像，file:{}", avatarBase64);

        return toAjax(userInfoService.updateAvatar(avatarBase64, name));
    }

    /**
     * 更新密码
     *
     * @param Data 数据
     * @return {@link AjaxResult }
     * @author ling
     * @date 2024/12/10
     */
    @PostMapping("/updatePassword")
    public AjaxResult updatePassword(@RequestBody String Data) {
//        对数据进行校验

        JSONObject jsonObject = JSONUtil.parseObj(Data);
        String password = jsonObject.getStr("password");
        String RePassword = jsonObject.getStr("RePassword");
        String userId = jsonObject.getStr("userId");
        logger.info("更新用户密码，password:{},RePassword:{},userId:{}", password, RePassword, userId);
        if (!password.equals(RePassword)) {
            return AjaxResult.error("两次密码不一致");
        }

        return toAjax(userInfoService.updatePassword(password, userId));
    }

}